在fpga工程应用设计中,随处可见加法器,乘法器等等。现在将一些常用模块和心得体会先记录下来,以便日后使用。
一位半加器:
1
2
3
4
5
6
7
8
9module halfadder(cout,sum,a,b);
outputcout,sum; //不申明,默认是wire变量
input a,b;
assign{cout,sum}=a+b;//cout为进位,sum为和
endmodule
一位全加器:
1
2
3
4
5
6
7
8
9module fulladder(a,b,cin,cout,sum);
inputa,b,cin;
outputcout,sum;
assign{cout,sum}=a+b+cin;
endmodule
利用两个半加器实现全加器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37module halfadder(a,b,sum,cout);
outputcout,sum; //不申明,默认是wire变量
input a,b;
assign{cout,sum}=a+b;
endmodule
module fulladder(x,y,c_in,sum,c_out);
inputx;
inputy;
inputc_in;
outputsum;
outputc_out;
wirea_sum;
wirea_out;
wireb_out;
assignc_out=a_out|b_out;
halfadderhalf(x,y,a_sum,a_out);
halfadderhalf1(c_in,a_sum,sum,b_out);
endmodule
测试文件的编写技巧
就拿上面的半加器来说,我们需要添加的就是输入信号a,b.可以采用下列方法:
第一种:
1
2
3
4
5
6
7#100 a=0;
#100 b=0;
#100 a=1;
#100 b=1;这种编辑方式虽然十分方便,可是对于很多情况的测试编写困难。
第二种:
1
2
3
4
5
6
7
8
9
10
11Integer I;
For(i=0;i<=15;i=i+1)
a=I;//注意这里a是一位,因此输出为0101010101010101
第三种:
Repeat(16)
a ={$random}%2;//这里产生随机的0 1比特流。